#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-10-24 21:44
# @Author : youngchaolin

'''
haslib
封装一些用于加密的类

md5：加密的目的，用于判断和验证，而并非解密
特点：
1 把一个大的数据，切分成不同的块然后分别加密，再汇总结果，和直接对一个整体的文件进行加密，其
结果是一样的
2 单向加密不可逆，但是目前已被中国一个教授破解，做到可逆
3 原数数据的一点小的变化，将导致结果非常非常大的差异，也叫雪崩式差异
'''

import hashlib

# md5加密算法

# 1 获取一个加密对象
m = hashlib.md5()
# 2 使用加密对象的update方法
m.update('messi'.encode('utf-8'))
# 3 调用hexdigest获取加密结果
res = m.hexdigest()
print(res)
print(len(res))

# 也可以通过digest方法获取结果
res = m.digest()
print(res)

'''
使用三大步
1 获取一个加密对象，如md5，sha1
2 使用加密对象的update方法，可以多次调用update方法
3 通常调用hexdigest方法获取加密结果，或者也可以使用digest方法
'''

# 如果两个数据加密的结果一样，说明原文相同，否则原文不同，因此加密主要用于验证，而非解密

# 使用不同的加密算法，将得到不同长度的加密结果
m = hashlib.sha1()
m.update('messi'.encode('utf-8'))
print(m.hexdigest())
print(len(m.hexdigest()))

# 在创建加密对象时，可以指定参数，也可以称为加盐
print('加盐')
m = hashlib.md5(b'abcdef')
print(m.hexdigest())  # e80b5017098950fc58aad83c8c14978e

# 和上面的加密结果一样
m = hashlib.md5()
m.update(b'abc')
m.update(b'def')
print(m.hexdigest())  # e80b5017098950fc58aad83c8c14978e

# 多次加密和整体一次加密的结果一样
m = hashlib.md5()
m.update(b'abcdef')
print(m.hexdigest())


# 注册登录验证，加入md5验证

def regist(username, password):
    m = hashlib.md5()
    # 用户名和密码拼接一起加密
    m.update(username.strip().encode('utf-8'))
    m.update(password.strip().encode('utf-8'))
    with open('userpwd.txt', mode='at') as f:
        f.write(m.hexdigest() + '\n')


def login(username, password):
    m = hashlib.md5()
    # 用户名和密码拼接一起加密
    m.update(username.strip().encode('utf-8'))
    m.update(password.strip().encode('utf-8'))
    with open('userpwd.txt', mode='rt') as f:
        # 循环判断
        for line in f:
            if line.strip() == m.hexdigest():
                return True
        else:
            return False

# alt+enter自动生成方法

while 1:
    choice = input('1 注册，2 登录，3 退出')
    if choice == '3':
        break
    elif choice == '1':
        username = input('请输入用户名')
        password = input('请输入密码')
        regist(username, password)
    elif choice == '2':
        username = input('请输入用户名')
        password = input('请输入密码')
        res = login(username, password)
        if res:
            print('登录成功')
        else:
            print('登录失败')
    else:
        print('未知操作')
